<?php

namespace Project\ScrumBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Project\ScrumBundle\Entity\Groupe;
use Project\ScrumBundle\Entity\Sprint;
use Project\ScrumBundle\Entity\Affectation;
use Project\ScrumBundle\Form\GroupeType;
use Project\ScrumBundle\Form\SprintType;
use Project\ScrumBundle\Form\AffectationType;
use Project\ScrumBundle\Classe\StatsEnum;

/**
 * Description of ScrumMasterController
 *
 * @author Seal
 */
class ScrumMasterController extends Controller {

    /**
     * Fonction servant a creer une groupe de developpeur, seul le scrummaster peut le faire.
     * @return type
     */
    public function createGroupAction() {
        $session = $this->get('session');
        //Si l'utilisateur est scrummaster, on affiche la page
        if ($session->get('role') == "ROLE_SCRUMMASTER") {

            //création du formulaire
            $groupe = new Groupe();
            $groupeType = new GroupeType();
            $form = $this->createForm($groupeType, $groupe);

            // On récupère la requête
            $request = $this->get('request');
            $em = $this->getDoctrine()->getManager();

            // On vérifie qu'elle est de type POST
            if ($request->getMethod() == 'POST') {
                // On fait le lien Requête <-> Formulaire
                $form->bind($request);
                // On l'enregistre notre objet dans la base de données                
                $em->persist($groupe);

                if ($groupe->getUtilisateur()[0] != null && $groupe->getNom() != null) {
                    $utilisateurs = $groupe->getUtilisateur();
                    foreach ($utilisateurs as $utilisateur) {
                        $utilisateur->addGroupeGroupe($groupe);
                        $utilisateur->setAffectation(true);
                        $em->persist($utilisateur);
                    }
                    $em->flush();
                }
            }

            //On affiche la liste des groupes
            $groupesdb = $em->getRepository('ProjectScrumBundle:Groupe')->findAll();
            return $this->render('ProjectScrumBundle:ScrumMaster:creategroup.html.twig', array('form' => $form->createView(), 'groupesdb' => $groupesdb));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction servant a creer un sprint 
     * @return type
     */
    public function createSprintAction() {
        $session = $this->get('session');
        //Si l'utilisateur est le scrum master, on affiche la page
        if ($session->get('role') != "Role_SCRUMMASTER") {

            $sprint = new Sprint();
            $sprinttype = new SprintType();
            $form = $this->createForm($sprinttype, $sprint);


            // On récupère la requête
            $request = $this->get('request');
            $em = $this->getDoctrine()->getManager();
            // On vérifie qu'elle est de type POST
            if ($request->getMethod() == 'POST') {
                // On fait le lien Requête <-> Formulaire
                $form->bind($request);
                if ($form->isValid()) {
                    // On l'enregistre notre objet dans la base de données
                    $sprints = $em->getRepository('ProjectScrumBundle:Sprint')->findAll();
                    foreach ($sprints as $sp) {
                        $sp->setLast(false);
                        $em->persist($sp);
                    }
                    $sprint->setLast(true);
                    $em->persist($sprint);

                    if ($sprint->getPtsDifficulte() != null && $sprint->getRefGroupe() != null) {
                        $em->flush();
                    }
                }
            }
            //On affiche la liste des sprint
            $sprintsdb = $em->getRepository('ProjectScrumBundle:Sprint')->findAll();

            return $this->render('ProjectScrumBundle:ScrumMaster:createsprint.html.twig', array('form' => $form->createView(), 'sprintsdb' => $sprintsdb));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction permettant d'affecter des userstories a des sprints
     * @return type
     */
    public function affectAction() {
        $session = $this->get('session');
        //Si l'utilisateur est le scrum master, on affiche la page
        if ($session->get('role') != "Role_SCRUMMASTER") {

            $affectation = new Affectation();
            $affectationType = new AffectationType();
            $form = $this->createForm($affectationType, $affectation);

            // On récupère la requête
            $request = $this->get('request');
            $em = $this->getDoctrine()->getManager();

            // On vérifie qu'elle est de type POST
            if ($request->getMethod() == 'POST') {
                // On fait le lien Requête <-> Formulaire
                $form->bind($request);
                $lastSprint = $this->getLastSprint();
                $affectation->setRefSprint($lastSprint);
                $affectation->setAvancement(0);

                $userstory = $affectation->getRefUserstorie();
                $userstory->setAffectation(true);

                // On l'enregistre notre objet dans la base de données 
                $em->persist($userstory);
                $em->persist($affectation);

                if ($affectation->getRefSprint() != null && $affectation->getRefUserstorie() != null && $affectation->getRefUtilisateur() != null) {
                    $em->flush();
                }
            }

            //On affiche la liste des affectation
            $affectationsdb = $em->getRepository('ProjectScrumBundle:Affectation')->findAll();

            return $this->render('ProjectScrumBundle:ScrumMaster:affect.html.twig', array('form' => $form->createView(), 'affectationsdb' => $affectationsdb));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction permettant d'afficher les stats
     * @return type
     */
    public function statsAction() {
        $session = $this->get('session');
        //Si l'utilisateur est le scrum master, on affiche la page
        if ($session->get('role') == "ROLE_SCRUMMASTER") {
            $em = $this->getDoctrine()->getManager();
            //On reccupere la liste des affectation a afficher dans le bar chart
            $affectationsdb = $em->getRepository('ProjectScrumBundle:Affectation')->findAll();

            //On reccupere les info utiles sous formes de tableaux associatif pour le radar chart
            $info = $this->getInfo($em);

            //On reccupere les cra pour le line chart
            $tabcra = $this->getCra($em);

            return $this->render('ProjectScrumBundle:ScrumMaster:stats.html.twig', array('affectationsdb' => $affectationsdb, 'info' => $info, 'tabcra' => $tabcra));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Retourne un tableau associatif contenant une date et le nombre de cra réalisé à cette date
     * @param type $em
     * @return int
     */
    private function getCra($em) {
        $tabcra = array();

        //On reccupere tous les cra
        $cra = $em->getRepository('ProjectScrumBundle:Cra')->findAll();
        foreach ($cra as $value) {
            $datecra = $value->getDate();

            $year = $datecra->format('Y');
            $month = intval($datecra->format('m')) - 1;
            $day = $datecra->format('d');
            $formatingDate = $year . "," . $month . "," . $day;
            if (array_key_exists($formatingDate, $tabcra)) {
                $tabcra[$formatingDate] = $tabcra[$formatingDate] + 1;
            } else {
                $tabcra[$formatingDate] = 1;
            }
        }
        return $tabcra;
    }

    /**
     * Renvoi un tableau associatif comprenant le nombre d'entrées pour chaques tables choisi
     * @param type $em
     * @return type
     */
    private function getInfo($em) {
        $info = array();

        //On reccupere tous les projets
        $projets = $em->getRepository('ProjectScrumBundle:Projet')->findAll();
        $info["projets"] = count($projets);

        //On reccupere tous les utilisateurs
        $utilisateurs = $em->getRepository('ProjectScrumBundle:Utilisateur')->findAll();
        $info["utilisateurs"] = count($utilisateurs);

        //On reccupere toutes les user stories
        $userstories = $em->getRepository('ProjectScrumBundle:Userstories')->findAll();
        $info["userstories"] = count($userstories);

        //On reccupere tous les sprints
        $sprints = $em->getRepository('ProjectScrumBundle:Sprint')->findAll();
        $info["sprints"] = count($sprints);

        //On reccupere tous les messages
        $messages = $em->getRepository('ProjectScrumBundle:Message')->findAll();
        $info["messages"] = count($messages);

        //On reccupere tous les groupes
        $groupes = $em->getRepository('ProjectScrumBundle:Groupe')->findAll();
        $info["groupes"] = count($groupes);

        //On reccupere tous les cra
        $cra = $em->getRepository('ProjectScrumBundle:Cra')->findAll();
        $info["cra"] = count($cra);

        //On reccupere toutes les affectations
        $affectations = $em->getRepository('ProjectScrumBundle:Affectation')->findAll();
        $info["affectations"] = count($affectations);

        return $info;
    }

    /**
     * recupere le dernier sprint avec l'attribut 'last' à true
     * @return type
     */
    private function getLastSprint() {
        $em = $this->getDoctrine()->getManager();
        return $em->getRepository('ProjectScrumBundle:Sprint')->findBy(array('last' => true))[0];
    }

}